package recursion;

import java.util.LinkedList;

// 汉诺塔
public class HanoiTower {
    private static LinkedList<Integer> a = new LinkedList<>();
    private static LinkedList<Integer> b = new LinkedList<>();
    private static LinkedList<Integer> c = new LinkedList<>();

    // 初始化 将圆盘放入a柱里
    public static void init(int num) {
        for (int i = num; i > 0; i--) {
            a.addLast(i);
        }
    }

    /**
     * 移动圆盘
     *
     * @param num 数字大小代表圆盘大小 数字越小圆盘越小
     * @param a   原始柱
     * @param b   借柱
     * @param c   目标柱
     */
    public static void move(int num, LinkedList<Integer> a, LinkedList<Integer> b, LinkedList<Integer> c) {
        if (num == 0) {
            return;
        }
        // 第一步 将num-1的圆盘整体移到借柱
        move(num - 1, a, c, b);
        // 第二步 将最大的圆盘num 移入目标柱
        c.addLast(a.removeLast());
        // 打印流程
        print();
        // 第三步 将圆盘剩下的num-1整体移入目标柱
        move(num - 1, b, a, c);
    }

    private static void print() {
        System.out.println("---------");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }

    public static void main(String[] args) {
        init(5);
        move(5,a,b,c);
    }
}
